<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //一、既有变量提升又有函数提升
      //原本的代码
      //   console.log(a) //function
      //   var a = 20
      //   function a() {
      //     console.log('a')
      //   }
      //   console.log(a)  //20
      /*
      预解析之后的代码  只会提升变量的声明 变量的赋值还是在原来的位置  然后再提升函数
        var a;
        function a(){
          console.log(a);
        }
        a = 10; 
        console.log(a);
     */
      /* 
      var a;
      function a(){};
      console.log(a);
      a=10;
      console.log(a);
    
    */

      /* 
        var a
        function a(){}
        console.log(a)
        a=10
   */

      /* 
 
 二、函数内部的提升 会提升到函数作用域顶部
   */
      //   function myFn() {
      //     // var a
      //     // console.log(a);
      //     // a =10;
      //     // console.log(a);
      //     console.log(a);
      //     var a = 20;
      //     console.log(a);
      //     function a() {
      //       console.log('我是函数');
      //     }
      //     console.log(a);
      //   }
      //   myFn()

      // console.log(a);

      /* 
      优先提升变量声明    其次是函数声明
      var a 
      function a(){
      }
      a=20
      console.log(a)
      */
      //三、函数内的提升 包含参数
      //优先提升变量声明  提升参数赋值    提升函数
      //  function myFn(a){
      //        console.log(a); //function
      //         var a =10;
      //         console.log(a); //10
      //         function a(){
      //             console.log('a函数');
      //         }
      //         console.log(a); //10
      //  }
      /* 
     预解析之后
     var a；
     a=1
     function a(){}
    console.log(a)
     a=10
     console.log(a)
     console.log(a)
     */
      //  myFn(1)

      // 四、诡异的提升

    //   console.log(a);
    //   if(false){
        // var a = 10;
    //   }



    /* 
    总结 提升 
    一、全局范围提升，提升至script底下 先提升变量声明 之后再提升命名式函数定义
    二 、函数内部提升 只会提升到函数底下1、优先提升变量声明2、 提升参数赋值 3、提升函数定义
    三、诡异的提升 if里判断是false  也会做变量提升；
    */
    </script>
  </body>
</html>
